22787
4223
将java.nio.ByteBuffer a转换为(新创建的)CharBuffer b或char [] b的最快方法是什么。
这样做很重要,a [i] == b [i]。这意味着,不是a [i]和a [i + 1]一起组成一个值b [j],getChar(i)会做什么,但是这些值应该“扩展”。
byte a [] = {1,2,3,125,126,127,-128,-127,-126} //每个字节(已签名)
char b [] = {1,2,3,125,126,127,128,129,130} //每个为char(未签名)
请注意,字节:-128具有与char:128相同(低8位)的位。因此,我认为“最佳”解释将如上所述,因为位是相同的。
之后,我还需要反之亦然的翻译:将char []或java.nio.CharBuffer返回到java.nio.ByteBuffer的最有效方法。 
因此,您想要的是使用编码ISO-8859-1进行转换。
我对效率没有任何要求,但至少写起来很短:
CharBuffer结果= Charset.forName(“ ISO-8859-1”)。decode(byteBuffer);
另一个方向是:
ByteBuffer结果= Charset.forName(“ ISO-8859-1”)。encode(charBuffer);
请对照其他解决方案对此进行衡量。 (公平地说,不应包含Charset.forName部分,并且也应该仅执行一次,而不是再次对每个缓冲区执行一次。)
从Java 7开始,还有带有预先实例化的Charset实例的StandardCharsets类,因此您可以使用
CharBuffer结果= StandardCharsets.ISO_8859_1.decode(byteBuffer);
和
ByteBuffer结果= StandardCharsets.ISO_8859_1.encode(charBuffer);
代替。 (这些行与以前的行相同,只是查找更容易,并且没有错误输入名称的风险,也无需捕获不可能的异常。)
|
我同意@Ishtar的建议,建议完全避免转换为新结构,而仅在需要时进行转换。
但是,如果您有堆ByteBuffer,则可以这样做。
ByteBuffer bb = ...
byte [] array = bb.array();
char [] chars = new char [bb.remaining()];
对于(int i = 0; i